<?php
/**
 * Класс хранящий хэши(или просто "слепки" (snapshots)) итемов rss потоков. 
 * По набору слепков можно определить обновился ли поток, какие итемы в нем появились, а какие ушли.
 * Понятие слепок использовано по аналогии со слепком зубов, который делают судмедэксперты для идентификации человека.
 * 
 * Типовое использование:
 * 1) getSnapshotsByFeedOid($feed_oid) - получить список слепков для потока
 * 2) пройти исходный поток, рассчитывая хэш для каждой записи используя makeHash(). 
 * Если хэш найден в списке слепков, то это означает что итем присутствует в потоке
 * Если не найден, то сохранить хэш для добавления в список слепков, и зафиксировать что это новой итем в потоке.
 * 
 * Если в списке есть хэши, которых нет в исходном потоке, то это итемы устаревшие и ушедшие из потока, 
 * их нужно сохранить отдельно для удаления из потока. 
 * 
 * 3) используя addSnapshots() добавить новые слепки потока
 * 4) для идшников слепков на удаление выполнить rmSnapshots()
 * 
 * @author Alexander Sibiryakov
 **/
class Model_RssFeedSnapshots extends RL_Model2 {
	
	/*
	 * Получить список слепков для потока
	 * 
	 * @param $feed_oid
	 * @return  array(	"[hash]"=>"oid"	 )
	 */
	public function getSnapshotsByFeedOid($feed_oid) {
		$db_pr = $this->db->db_prefix;
		
		$sql = "SELECT oid, hash FROM `t_rssfeedsnapshots` WHERE rssfeed_list_oid = ".$feed_oid;
		
		$rs = $this->db->query( $sql );
		if (!$rs) return array();
		$snapshot = array();
		foreach ($rs as $k=>$v) {
			$snapshot[ $v['hash'] ] = $v['oid'];
		}
		return $snapshot;
	}
	
	/*
	 * Получить хэш. Инкапсулирует функцию хэширования.
	 */
	public function makeHash($str) {
		return md5($str);
	}
	
	/*
	 * Удалить слепки из потока, используя массив их идентификаторов
	 * @param array
	 */
	public function rmSnapshots(array $remove_oids) {
		$db_pr = $this->db->db_prefix;
		foreach ($remove_oids as $oid) {
			$sql = "DELETE FROM `t_rssfeedsnapshots` WHERE oid=".$oid;
			$this->db->execute($sql);
		}
	}
	
	/*
	 * Добавить новые слепки в список слепков потока
	 * 
	 * @param array(hash1, hash2, ...)
	 * @param $feed_oid 
	 */
	public function addSnapshots(array $hashes, $feed_oid) {
		$db_pr = $this->db->db_prefix;
		foreach ($hashes as $k=>$v) {
			// TODO: надо бы заюзать тут multi-row инсерт
			$sql = "INSERT INTO `t_rssfeedsnapshots` VALUES(NULL, ".$feed_oid.", ".$this->db->quote($v).")";
			$this->db->insert($sql);
		}
	}
}
?>
